package inspection

//
//import (
//	"encoding/json"
//	"fmt"
//	metaD "db2s/TableMetaDataInit"
//	"db2s/dbExec"
//	"db2s/global"
//	"math"
//	"os"
//	"reflect"
//	"strings"
//)
//
//func indexInit(IndexData map[string]map[string]any, plan2 *SchedulePlan2, v string) {
//	var (
//		v1 map[string]any
//		ok bool
//	)
//	if v1, ok = IndexData[v]; !ok {
//		return
//	}
//
//	if _, ok2 := v1["indexType"]; !ok2 {
//		return
//	}
//	if v1["indexType"] == nil {
//		plan2.indexColumnType = ""
//	} else {
//		plan2.indexColumnType = v1["indexType"].(string)
//	}
//	if _, ok2 := v1["indexColumn"]; !ok2 {
//		fmt.Print("------:不存在indexColumn")
//		return
//	}
//	if v1["indexColumn"] == nil {
//		plan2.indexColumn = nil
//	} else {
//		plan2.indexColumn = v1["indexColumn"].([]string)
//	}
//	if _, ok2 := v1["indexColumnSeq"]; !ok2 {
//		return
//	}
//	if v1["indexColumnSeq"] == nil {
//		plan2.indexColumnSeq = nil
//	} else {
//		plan2.indexColumnSeq = v1["indexColumnSeq"].(map[string]string)
//	}
//}
//
//// table sum pod Init
//func (t CheckSchemaMetaData) podInit(n any) *global.TPod {
//	event := "[podInit]"
//	switch GlobalPConfigs.rules.CheckMode {
//	case "sync":
//		jsonData, err := json.Marshal(n)
//		if err != nil {
//			global.Wlog.Error(fmt.Sprintf("(%d) %s map strconv json fail. error info is %v", 1, event, err))
//		}
//		var selectRows, insertRows, syncStatus, syncSum int64 = 0, 0, 0, 0
//		var tsync = global.Tsync{Seq: "1", CheckMode: "sync", SelectRows: &selectRows,
//			InsertRows: &insertRows, SyncStatus: &syncStatus, SyncInfo: "ok", SyncSum: &syncSum}
//		if err = json.Unmarshal(jsonData, &tsync); err != nil {
//			global.Wlog.Error(fmt.Sprintf("(%d) %s json strconv struct fail. error info is %v", 1, event, err))
//		}
//		return &global.TPod{Sync: tsync}
//	}
//	return &global.TPod{}
//}
//
//func tableRowsInit(plan *SchedulePlan2, logSeq int64) {
//	plan.TotalCount = func() int64 {
//		A, err := dbExec.TQuery(plan.idxc).TableRows(GlobalPConfigs.SDB, logSeq)
//		if err != nil {
//			return 0
//		}
//		B, err := dbExec.TQuery(plan.dstIdxc).TableRows(GlobalPConfigs.DDB, logSeq)
//		if err != nil {
//			return 0
//		}
//		return int64(math.Max(float64(A), float64(B)))
//	}()
//	plan.tableLimit = int64(GlobalPConfigs.rules.ChanRowCount * GlobalPConfigs.rules.Mcc)
//}
//func getSchemaToTableMap(s, t any) string {
//	return fmt.Sprintf("%v%s%v", s, global.SchemaTableSplist, t)
//}
//
//func tatilMessageInit(plan2 *SchedulePlan2) {
//	var (
//		product  int64 = 0
//		customer int64 = 0
//		mqstart  int64 = 0
//		mqlevels int64 = 0
//		mqlevelr int64 = 0
//	)
//	plan2.mqProductCustomerMonitor = mqProductCustomerMonitorMessage{
//		mqProductSeq:           &product,
//		mqCustomerSeq:          &customer,
//		mqStartTiming:          &mqstart,
//		mqLevelProductSend:     &mqlevels,
//		mqLevelCustomerReceive: &mqlevelr,
//		ProductMessage:          make(chan map[string][]string),
//	}
//}
//
//func initSyncSchedulePlan(s *SchemaInitContext) map[string]*SchedulePlan2 {
//	var (
//		m            = make(map[string]*SchedulePlan2)
//		logThreadSeq int64
//		event        string
//	)
//	for _, v := range s.TableList {
//		f0 := strings.Split(v, global.SchemaTableSplist)
//		schema := f0[0]
//		table := f0[1]
//		var jhsum int64 = 0
//		vlog := fmt.Sprintf("(%d) %s The %s data source at the %s.%s failed to initialize table structure.", logThreadSeq, event, GlobalPConfigs.dSns.SrcDBName, schema, table)
//		global.Wlog.Debug(vlog)
//		var indexColumn []string
//		indexType := ""
//		if lv, ok := s.IndexData[v]["indexColumn"]; ok && lv != nil {
//			indexColumn = s.IndexData[v]["indexColumn"].([]string)
//		}
//		if lv, ok := s.IndexData[v]["forceMiss"]; ok && lv != nil {
//			indexType = s.IndexData[v]["forceMiss"].(string)
//		}
//		var errend int64 = 0
//		md := metaD.GetTableStrconvO()
//		md.Schema = schema
//		md.Table = table
//		md.TableMap = GlobalPConfigs.schema.MapTables
//		mschema, mtable := metaD.SchemaTableCorver(*md)
//		//原目标端是否存在
//		continueTrue := true
//		for _, v1 := range []string{v, fmt.Sprintf("%v%s%v", mschema, global.SchemaTableSplist, mtable)} {
//			if _, ok := s.TcolumnMeta[v1]; ok {
//				continueTrue = false
//			}
//		}
//
//		if continueTrue {
//			global.Wlog.Warn(fmt.Sprintf("(%d) %v table %v.%v not is exist!,will continue.", logThreadSeq, event, schema, table))
//			continue
//		}
//		plan2 := &SchedulePlan2{
//			schema:  schema,
//			table:   table,
//			mschema: fmt.Sprintf("%v", mschema),
//			mtable:  fmt.Sprintf("%v", mtable),
//			dbf: dbExec.DataAbnormalFixStruct{Schema: fmt.Sprintf("%v", mschema), Table: fmt.Sprintf("%v", mtable), DestDevice: GlobalPConfigs.dSns.DestDrive,
//				DataFixType: GlobalPConfigs.repair.DataFix, DBType: GlobalPConfigs.dSns.DestDBName, AppTable: dbExec.AppTableS{
//					AppType:            "insert",
//					ShardName:          s.TDistributed["dest"][fmt.Sprintf("%v%v%v", mschema, global.SchemaTableSplist, mtable)],
//					IgnoreColumnLength: GlobalPConfigs.rules.Sync.IgnoreColumnLength,
//					Esa:                GlobalPConfigs.schema.EncryptionProperties[v],
//				},
//				SqlMode: GlobalPConfigs.rules.Sync.SqlMode,
//			},
//			tableColData:    TableAllColumnInfoS{SColumnInfo: s.TcolumnMeta[v]["source"].ColumnM, DColumnInfo: s.TcolumnMeta[getSchemaToTableMap(mschema, mtable)]["dest"].ColumnM},
//			logThreadSeq:    logThreadSeq,
//			errEnd:          &errend,
//			indexColumn:     indexColumn,
//			indexColumnType: indexType,
//			sshardName:      s.TDistributed["source"][v],
//			dshardName:      s.TDistributed["dest"][fmt.Sprintf("%v%v%v", mschema, global.SchemaTableSplist, mtable)],
//			sync: global.SyncPlan{CheckMod: "count", CheckRows: global.SyncCheckCount{SrcCheckCount: &jhsum},
//				PartitionData: s.TablePartiton[v]},
//			chunkStartSource: "src",
//		}
//		indexInit(s.IndexData, plan2, v)
//		plan2.idxc = dbExec.IndexColumnStruct{Schema: schema, Table: table,
//			Drivce: GlobalPConfigs.dSns.SrcDrive, ColData: plan2.tableColData.SColumnInfo, DBType: GlobalPConfigs.dSns.SrcDBName, ColumnName: plan2.indexColumn,
//			TableColumn: plan2.tableColData.SColumnInfo, ShardName: plan2.sshardName, FixRows: GlobalPConfigs.rules.Sync.FixRows,
//			SqlExecStopTime: GlobalPConfigs.rules.RowsR.OutTime, Scn: GlobalPConfigs.rules.Sync.Scn,
//			SqlMode: GlobalPConfigs.rules.Sync.SqlMode, Eas: GlobalPConfigs.schema.EncryptionProperties[v],
//		}
//		plan2.dstIdxc = dbExec.IndexColumnStruct{Schema: fmt.Sprintf("%v", mschema), Table: fmt.Sprintf("%v", mtable),
//			Drivce: GlobalPConfigs.dSns.DestDrive, ColData: plan2.tableColData.DColumnInfo, DBType: GlobalPConfigs.dSns.DestDBName,
//			ColumnName: plan2.indexColumn, TableColumn: plan2.tableColData.DColumnInfo, ShardName: plan2.dshardName,
//			FixRows: GlobalPConfigs.rules.Sync.FixRows, SqlExecStopTime: GlobalPConfigs.rules.RowsR.OutTime,
//			SqlMode: GlobalPConfigs.rules.Sync.SqlMode, Eas: GlobalPConfigs.schema.EncryptionProperties[v],
//		}
//		if GlobalPConfigs.activeSwitch.TableTruncate {
//			fmt.Println(fmt.Sprintf("-- db2s begin truncate table %s.%s --", schema, table))
//			if !dbExec.TQuery(plan2.dstIdxc).TableTruncate(GlobalPConfigs.DDB, 1) {
//				fmt.Println(fmt.Sprintf("db2s report: truncate table %s.%s fail! will exit", schema, table))
//				os.Exit(1)
//			}
//		}
//		tableRowsInit(plan2, 1)
//		subTaskInit(plan2)
//		tatilMessageInit(plan2)
//		m[plan2.SchemaToTable()] = plan2
//	}
//	for _, v := range s.TableMiss {
//		f0 := strings.Split(v, global.SchemaTableSplist)
//		schema := f0[0]
//		table := f0[1]
//		m[fmt.Sprintf("%v.%v", schema, table)] = nil
//	}
//	return m
//}
//
//// InitToSchedulePlan2Table 初始化 执行计划 以 map 的形式 key 表名 value SchedulePlan2
//func InitToSchedulePlan2Table() (s []map[string]*SchedulePlan2, p []string) {
//	var (
//		Event1       = "[InitToSchedulePlan2Table]"
//		vlog         string
//		logThreadSeq int64
//		f2           = global.GetIoc().GetBean("schemaInitContext").(*SchemaInitContext)
//	)
//	for _, k := range f2.ChanSchemaContext {
//		if funcName, ok := ScheduleTaskInitFuncRef[GlobalPConfigs.rules.CheckMode]; ok {
//			if funcName.Kind() == reflect.Func {
//				arguments := []reflect.Value{
//					reflect.ValueOf(k)}
//				m1 := funcName.Call(arguments)
//				var m2 = make(map[string]*SchedulePlan2)
//				for i := 0; i < len(m1); i++ {
//					m2 = m1[i].Interface().(map[string]*SchedulePlan2)
//				}
//				if len(m2) == 0 {
//					vlog = fmt.Sprintf("(%d) %s Failed to initialize the table structure of the verification table at the source. There are currently no tables to validate!!!", logThreadSeq, Event1)
//					global.Wlog.Warn(vlog)
//					fmt.Println("db2s report: check table is Empty!, quit quit quit please check the log for details!")
//					continue
//				} else {
//					var m3 = make(map[string]*SchedulePlan2)
//					for k1, v1 := range m2 {
//						if v1 == nil {
//							p = append(p, k1)
//						} else {
//							m3[k1] = v1
//						}
//					}
//					s = append(s, m3)
//				}
//			}
//		} else {
//
//		}
//	}
//	if len(s) == 0 {
//		return nil, nil
//	}
//	return
//}
